package logica.persistencia;

import java.util.LinkedList;
import java.util.List;

import org.jdom.Element;

import xml.ConstantesXml;
import logica.Atributo;
import logica.AtributoCompuesto;
import logica.AtributoRepetidoException;

import logica.AtributoSimpleException;
import logica.SinNombreException;

public class AtributoCompuestoPersistente extends AtributoPersistente {

	public AtributoCompuestoPersistente(Atributo atributo) {
		super(atributo);
	}
	
	@Override
	public void serializar() {
		Element atributoCompuesto = new Element(ConstantesXml.ELEMENTO_ATRIBUTO_COMPUESTO);
		super.serializarElementoGenerico(atributoCompuesto);
		AtributoCompuesto atribCompuesto = (AtributoCompuesto) this.getAtributo();
		
		if (atribCompuesto.getAtributos().size() > 0) {
			Element listaAtributos = new Element (ConstantesXml.LISTA_ATRIBUTOS);	
			for (Atributo atributo : atribCompuesto.getAtributos()) {
				AtributoPersistente atribP = atributo.getAtributoPersistente();
				atribP.setPadre(listaAtributos);
				atribP.serializar();
			}
			atributoCompuesto.addContent(listaAtributos);
		}
	}

	public void hidratar(Element elementoAtributoCompuesto) {

		Element elementListaAtributos = elementoAtributoCompuesto.getChild(ConstantesXml.LISTA_ATRIBUTOS);
		
		if (elementListaAtributos != null) {
			@SuppressWarnings("unchecked")
			List <Element> elementListaAtributosSimples = elementListaAtributos.getChildren(ConstantesXml.ELEMENTO_ATRIBUTO_SIMPLE);
			List <Atributo> listaAtribSimples = AtributoSimplePersistente.hidratarListaAtributosSimples(elementListaAtributosSimples);
			try {
				this.getAtributo().agregarAtributos(listaAtribSimples);
			} catch (AtributoRepetidoException e) {
				e.printStackTrace();
			} catch (AtributoSimpleException e) {
				e.printStackTrace();
			}
			@SuppressWarnings("unchecked")
			List <Element> elementListaAtributosCompuestos = elementListaAtributos.getChildren(ConstantesXml.ELEMENTO_ATRIBUTO_COMPUESTO);
			List <Atributo> listaAtribCompuestos = AtributoCompuestoPersistente.hidratarListaAtributosCompuestos(elementListaAtributosCompuestos);
			try {
				this.getAtributo().agregarAtributos(listaAtribCompuestos);
			} catch (AtributoRepetidoException e) {
				e.printStackTrace();
			} catch (AtributoSimpleException e) {
				e.printStackTrace();
			}
		}
	}

	public static List<Atributo> hidratarListaAtributosCompuestos(List <Element> elementListaAtributosCompuestos) {
		List<Atributo> atributos = new LinkedList<Atributo>();
		for (Element elementoAtributoCompuesto : elementListaAtributosCompuestos) {
			String nombreAtributo = elementoAtributoCompuesto.getAttributeValue(ConstantesXml.ATRIBUTO_NOMBRE);
			AtributoCompuesto atribC;
			try {
				atribC = new AtributoCompuesto(nombreAtributo);
				AtributoCompuestoPersistente atribCP = new AtributoCompuestoPersistente(atribC);
				atribCP.hidratarGenerico(elementoAtributoCompuesto);
				atribCP.hidratar(elementoAtributoCompuesto);
				atributos.add(atribC);
			} catch (SinNombreException e) {
				e.printStackTrace();
			} 
		}
		return atributos;
	}

}
